package test_pkg

import (
	"fmt"
	"math"
	"math/big"
)

func Test_math() {
	//绝对值
	x := math.Abs(-2)
	fmt.Printf("%.1f\n", x)

	y := math.Abs(2)
	fmt.Printf("%.1f\n", y)

	//立方根
	fmt.Printf("%.1f\n", math.Cbrt(9))

	//向上取整
	fmt.Printf("%.1f\n", math.Ceil(1.3))
	fmt.Printf("%.1f\n", math.Floor(1.3))

	//Dim(x, y float64) float64
	//返回 x-y 或者 0 中的较大值
	fmt.Printf("%.1f\n", math.Dim(4.3, -2))  //6.3
	fmt.Printf("%.1f\n", math.Dim(-4.3, -2)) //0

	//Expm1(x float64 ) float64  返回 e**x - 1，即 x 减去 1 的基数 e 指数。当 x 接近零时，它比 Exp(x) - 1 更准确
	fmt.Printf("%.6f\n", math.Expm1(0.01))
	fmt.Printf("%.6f\n", math.Expm1(-1))

	//拆分整数和小数 符号和原值保持一致
	int2, frac := math.Modf(3.14)
	fmt.Printf("%.2f, %.2f\n", int2, frac)

	//Pow(x, y float64 ) float64  返回 x**y，即 y 的以 x 为底的指数。
	fmt.Printf("%.2f\n", math.Pow(2, 3))
	fmt.Printf("%.1f\n", math.Pow10(2)) //10为底

	//四舍五入
	fmt.Println(math.Round(3.4))
	fmt.Println(math.Round(3.5))
}

// 精密计算 整数的高精度计算 Go 语言中提供了 big 包
func Test_math_big() {
	var x, y, z big.Float

	x.SetInt64(1000)          // x is automatically set to 64bit precision
	y.SetFloat64(2.718281828) // y is automatically set to 53bit precision
	z.SetPrec(32)
	z.Add(&x, &y)
	fmt.Printf("x = %.10g (%s, prec = %d, acc = %s)\n", &x, x.Text('p', 0), x.Prec(), x.Acc())
	fmt.Printf("y = %.10g (%s, prec = %d, acc = %s)\n", &y, y.Text('p', 0), y.Prec(), y.Acc())
	fmt.Printf("z = %.10g (%s, prec = %d, acc = %s)\n", &z, z.Text('p', 0), z.Prec(), z.Acc())

	a := big.NewInt(1)
	b := big.NewInt(99)
	a.Add(b, a)
	fmt.Printf("a: %v\n", a)
	a.Mul(a, b)
	fmt.Printf("a: %v\n", a)
	a.Div(a, b)
	fmt.Printf("a: %v\n", a)

}
